﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BO;
using AjaxControlToolkit;
using System.Web.UI.HtmlControls;
using System.Threading;
using System.IO;
using System.Text;

namespace WebMotel
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            if (!Page.IsPostBack)
            {
                atualizaListagem();
                CXFormaPagamentoBO.Listar(ddlPagar_FormaPagamento);
                ddlPagar_FormaPagamento.SelectedIndex = 1;

                AcomodacaoStatusBO.Listar(ddlPesquisar_Status);
                    ddlPesquisar_Status.Items[0].Text = "Todos";

                AcomodacaoTipoBO.Listar(ddlPesquisar_TipoAcomodacao);
                    ddlPesquisar_TipoAcomodacao.Items[0].Text = "Todos";
            }



        }

        public static void Redirect(string url, string target, string windowFeatures)
        {
            HttpContext context = HttpContext.Current;

            if ((String.IsNullOrEmpty(target) ||
                target.Equals("_self", StringComparison.OrdinalIgnoreCase)) &&
                String.IsNullOrEmpty(windowFeatures))
            {

                context.Response.Redirect(url);
            }
            else
            {
                Page page = (Page)context.Handler;
                if (page == null)
                {
                    throw new InvalidOperationException(
                        "Cannot redirect to new window outside Page context.");
                }
                url = page.ResolveClientUrl(url);

                string script;
                if (!String.IsNullOrEmpty(windowFeatures))
                {
                    script = @"window.open(""{0}"", ""{1}"", ""{2}"");";
                }
                else
                {
                    script = @"window.open(""{0}"", ""{1}"");";
                }

                script = String.Format(script, url, target, windowFeatures);
                ScriptManager.RegisterStartupScript(page,
                    typeof(Page),
                    "Redirect",
                    script,
                    true);
            }
        }

        protected void Page_LoadComplete(object sender, EventArgs e)
        {
            //for (int i = 0; i < rptQuartos.Items.Count; i++)
            //{
            //    HiddenField hfAcomodacaoID = (HiddenField)rptQuartos.Items[i].FindControl("hfAcomodacaoID");
            //    int acomodacaoID = int.Parse(hfAcomodacaoID.Value);
            //    var comandas = ComandaBO.Listar(0, acomodacaoID);

            //    Comanda comanda = comandas.FirstOrDefault(x => x.ComandaStatu.descricao.ToLower().Contains("aberta"));

            //    if (comanda != null)
            //    {

            //        string dtAmericana = comanda.dtHoraEntrada.Value.Date.Year + "/" + comanda.dtHoraEntrada.Value.Date.Month + "/" + comanda.dtHoraEntrada.Value.Date.Day;
            //        dtAmericana += " " + comanda.dtHoraEntrada.Value.TimeOfDay.ToString();

            //        ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), "mensagem", "tFuncDavi('" + dtAmericana + "')", true);
            //    }
            //}

        }

        public void showMensagem(string tipo, string mensagem)
        {
            divMensagem.Attributes["class"] = "mensagem " + tipo;
            pMensagem.InnerText = mensagem;
        }

        public void atualizaListagem()
        {
            divMensagem.Attributes["class"] = "mensagem ";

            try
            {

                int vTipoID = 0;
                if (ddlPesquisar_TipoAcomodacao.SelectedIndex > 0)
                    vTipoID = int.Parse(ddlPesquisar_TipoAcomodacao.SelectedValue);

                int vStatusID = 0;
                if (ddlPesquisar_Status.SelectedIndex > 0)
                    vStatusID = int.Parse(ddlPesquisar_Status.SelectedValue);


                var objs = (from a in AcomodacaoBO.Listar(0, vTipoID, vStatusID, txtPesquisar_Nome.Text.Trim(), "")
                            orderby a.acomodacaoTipoID
                            select new
                            {
                                ID = a.id,
                                Class = "widget-header header-color-" + a.AcomodacaoStatu.cor,
                                ClassBtn = "btn btn-info btn-mini",
                                Tipo = a.AcomodacaoTipo.descricao,
                                Status = a.AcomodacaoStatu.descricao,
                                Nome = a.nome
                            }).ToList();


                rptQuartos.DataSource = objs;
                rptQuartos.DataBind();



                for(int  i=0; i< rptQuartos.Items.Count; i++)
                {
                    HiddenField hfStatus = (HiddenField)rptQuartos.Items[i].FindControl("hfStatus");
                    HiddenField hfAcomodacaoID = (HiddenField)rptQuartos.Items[i].FindControl("hfAcomodacaoID");
                    Label lblDataHoraEntrada = (Label)rptQuartos.Items[i].FindControl("lblDataHoraEntrada");
                    Label lblTempoDecorrido = (Label)rptQuartos.Items[i].FindControl("lblTempoDecorrido");
                    
                    
                    if (hfStatus != null)
                    {
                        if (hfStatus.Value.ToLower() == "disponível")
                        {
                            LinkButton btnIcon_CheckIN = (LinkButton)rptQuartos.Items[i].FindControl("btnIcon_CheckIN");
                            btnIcon_CheckIN.Visible = true;
                        }

                        else if (hfStatus.Value.ToLower() == "ocupado")
                        {
                            LinkButton btnIcon_AddItem = (LinkButton)rptQuartos.Items[i].FindControl("btnIcon_AddItem");
                            btnIcon_AddItem.Visible = true;

                            LinkButton btnIcon_PagarComanda = (LinkButton)rptQuartos.Items[i].FindControl("btnIcon_PagarComanda");
                            btnIcon_PagarComanda.Visible = true;

                            LinkButton btnIcon_ImprimirComanda = (LinkButton)rptQuartos.Items[i].FindControl("btnIcon_ImprimirComanda");
                            btnIcon_ImprimirComanda.Visible = true;
                        }

                        else if (hfStatus.Value.ToLower().Contains("limpeza"))
                        {
                            LinkButton btnIcon_LiberarAposLimpeza = (LinkButton)rptQuartos.Items[i].FindControl("btnIcon_LiberarAposLimpeza");
                            btnIcon_LiberarAposLimpeza.Visible = true;

                            LinkButton btnIcon_AddItem = (LinkButton)rptQuartos.Items[i].FindControl("btnIcon_AddItem");
                            btnIcon_AddItem.Visible = true;

                            LinkButton btnIcon_PagarComanda = (LinkButton)rptQuartos.Items[i].FindControl("btnIcon_PagarComanda");
                            btnIcon_PagarComanda.Visible = true;

                            LinkButton btnIcon_ImprimirComanda = (LinkButton)rptQuartos.Items[i].FindControl("btnIcon_ImprimirComanda");
                            btnIcon_ImprimirComanda.Visible = true;
                        }
                    }

                     Repeater rptItens = (Repeater)rptQuartos.Items[i].FindControl("rptItens");
                     if (rptItens != null)
                     {
                         DateTime now = PaginaBase.GetDate_doBanco();

                         int acomodacaoID = int.Parse(hfAcomodacaoID.Value);
                         Acomodacao acomodacao = AcomodacaoBO.Selecionar(acomodacaoID);

                         var comandas = ComandaBO.Listar(0, acomodacaoID);

                         Comanda comanda = comandas.FirstOrDefault(x => x.ComandaStatu.descricao.ToLower().Contains("aberta"));

                         if (comanda != null)
                         {
                             HiddenField hfComandaID = (HiddenField)rptQuartos.Items[i].FindControl("hfComandaID");
                             hfComandaID.Value = comanda.id.ToString();


                             lblDataHoraEntrada.Text = comanda.dtHoraEntrada.Value.Date.ToShortDateString() + " " + comanda.dtHoraEntrada.Value.TimeOfDay.ToString();
   
                             //DateTime dataFinal = DateTime.Now.AddHours(DateTime.Now.Hour).AddMinutes(DateTime.Now.Minute).AddSeconds(DateTime.Now.Second);

                             TimeSpan timeSpan = now.Subtract(comanda.dtHoraEntrada.Value);

                            string horas = timeSpan.Hours.ToString().PadLeft(2,'0');
                            string Minutes = timeSpan.Minutes.ToString().PadLeft(2, '0');
                            string Seconds = timeSpan.Seconds.ToString().PadLeft(2, '0');


                            lblTempoDecorrido.Text = horas + ":" + Minutes + ":" + Seconds;
                             
                             HtmlGenericControl div_listagemPedidos = rptQuartos.Items[i].FindControl("div_listagemPedidos") as HtmlGenericControl;

                             

                             if (hfStatus != null)
                             {
                                 if (acomodacao.AcomodacaoStatu.descricao.ToLower() == "disponível")
                                 {
                                     div_listagemPedidos.Visible = false;

                                 }

                                 else if (acomodacao.AcomodacaoStatu.descricao.ToLower() == "ocupado")
                                 {
                                     div_listagemPedidos.Visible = true;

                                 }

                                 else if (acomodacao.AcomodacaoStatu.descricao.ToLower().Contains("limpeza"))
                                 {
                                     div_listagemPedidos.Visible = true;

                                 }
                             }





                             var pedidos = (from a in PedidoBO.Listar(0, comanda.id)
                                            select new
                                            {
                                                ID = a.id,
                                                vlrUnitario = a.valorUnitario,
                                                qtd = a.quantidade,
                                                Descricao = a.Produto.descricao,
                                                status = a.PedidoStatu.descricao
                                            }).ToList();

                             decimal total = 0;
                             foreach (var item in pedidos)
                             {
                                 if (item.qtd != null)
                                 {
                                     if (item.vlrUnitario != null)
                                     {
                                         total += decimal.Parse(item.vlrUnitario.ToString()) * int.Parse(item.qtd.ToString());
                                     }
                                 }
                             }


                             Label lblTotal = (Label)rptQuartos.Items[i].FindControl("lblTotal");
                             lblTotal.Text = total.ToString("C");

                             rptItens.DataSource = pedidos;
                             rptItens.DataBind();




                             HtmlGenericControl itFuncDavi = rptQuartos.Items[i].FindControl("itFuncDavi") as HtmlGenericControl;
                             HtmlGenericControl TempoDecorridoDescricao = rptQuartos.Items[i].FindControl("TempoDecorridoDescricao") as HtmlGenericControl;
                             HtmlGenericControl TempoDecorrido = rptQuartos.Items[i].FindControl("TempoDecorrido") as HtmlGenericControl;
                              
                             if (itFuncDavi != null)
                             {
                                 string dtAmericana = comanda.dtHoraEntrada.Value.Date.Year + "/" + comanda.dtHoraEntrada.Value.Date.Month + "/" + comanda.dtHoraEntrada.Value.Date.Day;
                                 dtAmericana += " " + comanda.dtHoraEntrada.Value.TimeOfDay.ToString();

                                 string divID = "MainContent_rptQuartos_TempoDecorrido_" + i;

                                 string func = "tFunc('" + dtAmericana + "', '" + divID + "')";//"setInterval(function(){myTimer('" + dtAmericana + "', '" + divID + "')},1000);";

                                 if (comanda.dtHoraSaida == null)
                                 {
                                     TempoDecorridoDescricao.InnerText = "Tempo Decorrido:";
                                     itFuncDavi.Attributes.Add("onclick", func);
                                 }
                                 else
                                 {
                                     TempoDecorridoDescricao.InnerText = "Check-OUT:";
                                     TempoDecorrido.InnerText = comanda.dtHoraSaida.ToString();
                                 }
                             }
                         }
                     }
                }

            }
            catch (Exception)
            {
                
                throw;
            }
        }


        public void inserirEstadia(Comanda comanda, List<Produto> estadias, int horas, int minutos, double minutosTotal)
        {
            try
            {
                DateTime dtNow = PaginaBase.GetDate_doBanco();

                TimeSpan duration = dtNow.Subtract(comanda.dtHoraEntrada.Value);

                if (duration.Hours > 0 || duration.Minutes > 15)
                {
                    Produto produto = estadias.FirstOrDefault(x => x.minutos == minutos);

                    PedidoStatu pedidoStatus = PedidoStatusBO.Listar(0, "Consumido").FirstOrDefault();

                    // 
                    Pedido pedido = (from a in PedidoBO.Listar(0, comanda.id) where a.Produto.minutos == horas select a).FirstOrDefault();
                    if (pedido == null)
                    {
                        pedido = new Pedido();
                        pedido.comandaID = comanda.id;
                        pedido.produtoID = produto.id;
                        pedido.horaPedido = comanda.dtHoraEntrada;
                        pedido.observacoes = "";
                        pedido.quantidade = 1;


                        if (dtNow.Date.DayOfWeek == DayOfWeek.Friday)
                            pedido.valorUnitario = produto.valorUnitario + produto.vlrReajusteExtra;

                        else if (dtNow.Date.DayOfWeek == DayOfWeek.Saturday)
                            pedido.valorUnitario = produto.valorUnitario + produto.vlrReajusteExtra;

                        else if(FeriadoBO.Listar(0, dtNow.AddDays(1),"").Count > 0)
                            pedido.valorUnitario = produto.valorUnitario + produto.vlrReajusteExtra;
                        else
                            pedido.valorUnitario = produto.valorUnitario;

                        pedido.pedidoStatusID = pedidoStatus.id;

                        PedidoBO.Salvar(pedido, 0);
                    }

                    double tempoRestante = 0;
                    #region Corrigi tempo restante para contar horas extras somente após as 10 horas
                    if (horas == 6)
                    {
                        if (dtNow.Hour >= 10)
                        {
                            minutosTotal = dtNow.Minute;

                            for (int i = 10; i < dtNow.Hour; i++)
                            {
                                minutosTotal += 60;
                            }

                            tempoRestante = (minutosTotal);
                        }
                    }
                    #endregion

                    else
                    {
                        tempoRestante = (minutosTotal) - (horas * 60);
                    }

                    //if (tempoRestante < 0)
                    //    tempoRestante = tempoRestante * -1;


                    int quantidade = (from a in PedidoBO.Listar(0, comanda.id) where a.Produto.descricao.Contains("1 Hora Extra") select a).ToList().Count();

                    //15min de tolerancia
                    while (tempoRestante >= 15)
                    {
                        quantidade++;

                        // Add as horas extras
                        produto = new Produto();
                        produto = estadias.FirstOrDefault(x => x.minutos == 60 && x.descricao.Contains("Extra"));

                        pedido = (from a in PedidoBO.Listar(0, comanda.id) where a.Produto.descricao.Contains("1 Hora Extra") select a).FirstOrDefault();

                        if (pedido == null)
                            pedido = new Pedido();

                        pedido.comandaID = comanda.id;
                        pedido.produtoID = produto.id;
                        pedido.horaPedido = comanda.dtHoraEntrada;
                        pedido.observacoes = "";
                        pedido.quantidade = quantidade;

                        if (dtNow.Date.DayOfWeek == DayOfWeek.Friday)
                            pedido.valorUnitario = produto.valorUnitario + produto.vlrReajusteExtra;

                        else if (dtNow.Date.DayOfWeek == DayOfWeek.Saturday)
                            pedido.valorUnitario = produto.valorUnitario + produto.vlrReajusteExtra;

                        else if (FeriadoBO.Listar(0, dtNow.AddDays(1), "").Count > 0)
                            pedido.valorUnitario = produto.valorUnitario + produto.vlrReajusteExtra;
                        else
                            pedido.valorUnitario = produto.valorUnitario;

                        pedido.pedidoStatusID = pedidoStatus.id;

                        PedidoBO.Salvar(pedido, 0);


                        tempoRestante -= 60;
                    }
                }
              
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        public void calculaValorDiaria(int comandaID)
        {
            try
            {

             
                Comanda comanda = ComandaBO.Selecionar(comandaID);
                Acomodacao acomodacao = AcomodacaoBO.Selecionar(int.Parse(comanda.acomodocacaoID.ToString()));

                if (comanda != null)
                {

                    var deletaPedidos = (from a in PedidoBO.Listar(0, comanda.id) where a.Produto.acomodacaoTipoID == acomodacao.acomodacaoTipoID select a).ToList();

                    foreach (var item in deletaPedidos)
                    {
                        PedidoBO.Excluir(item.id, 0);
                    }


                    var estadias = ProdutoBO.Listar(0, 0, "");
                    estadias = (from a in estadias where a.acomodacaoTipoID == acomodacao.acomodacaoTipoID select a).ToList();

                    DateTime now = PaginaBase.GetDate_doBanco();

                    TimeSpan intervalo = now - comanda.dtHoraEntrada.Value;

                    double minutos = intervalo.Minutes;

              
                    // Se tem direito a pernoite
                    if (comanda.dtHoraEntrada.Value.Hour >= 22 /* || comanda.dtHoraEntrada.Value.Hour <= 4 */)
                    {
                        if (intervalo.Days > 0)
                        {
                            for (int j = 0; j < intervalo.Days; j++)
                            {
                                minutos += 1440;

                                for (int i = 0; i < intervalo.Hours; i++)
                                {
                                    minutos += 60;
                                }
                            }
                        }
                        else
                        {
                            for (int i = 0; i < intervalo.Hours; i++)
                            {
                                minutos += 60;
                            }
                        }

                        // Diária 24 horas (verificar se a diaria é cadastrada mais de uma vez caso o cliente passe mais de 48 horas)
                        if ((minutos / 60) >= 24)
                        {
                            inserirEstadia(comanda, estadias, 24, 1440, minutos);
                        }
                        else if ((minutos / 60) >= 6)
                        {
                            inserirEstadia(comanda, estadias, 6, 360, minutos);
                        }
                        // 3 Horas
                        else
                        {
                            if ((minutos / 60) >= 3)
                            {
                                inserirEstadia(comanda, estadias, 3, 180, minutos);
                            }
                            else
                            {
                                // Se tivesse uma hora, passaraia como parametro 1, 60
                                inserirEstadia(comanda, estadias, 3, 180, minutos);
                            }
                        }
                    }
                    else
                    {
                        // Faz o teste para saber o checkin foi antes das 22, e precisa realizar a pernoite
                        bool entra = false;
                        DateTime testa = comanda.dtHoraEntrada.Value;

                        DateTime dtNow = PaginaBase.GetDate_doBanco();

                        while (dtNow.Hour != testa.Hour)
                        {
                            if (testa.Hour == 22)
                                entra = true;
                            testa = testa.AddHours(01);
                        }

                        //entra pra conta das horas antes das 22 e depois das 22
                        if (entra == true)
                        {
                            #region Quantidade de horas antes das 22

                            // Quantidade de horas antes das 22
                            DateTime antesDas22 = comanda.dtHoraEntrada.Value;
                            while (antesDas22.Hour < 22)
                            {
                                antesDas22 = antesDas22.AddHours(01);
                            }



                            intervalo = antesDas22 - comanda.dtHoraEntrada.Value;

                            //Salva os minutos que ja estão dentro
                            minutos = intervalo.Minutes;

                            #region Calcula o total de minutos decorridos na estadia
                            if (intervalo.Days > 0)
                            {
                                for (int j = 0; j < intervalo.Days; j++)
                                {
                                    minutos += 1440;

                                    for (int i = 0; i < intervalo.Hours; i++)
                                    {
                                        minutos += 60;
                                    }
                                }
                            }
                            else
                            {
                                for (int i = 0; i < intervalo.Hours; i++)
                                {
                                    minutos += 60;
                                }
                            }
                            #endregion

                            if ((minutos / 60) >= 24)
                            {
                                inserirEstadia(comanda, estadias, 24, 1440, minutos);
                            }
                            else
                            {
                                if ((minutos / 60) >= 3)
                                {
                                    inserirEstadia(comanda, estadias, 3, 180, minutos);
                                }
                                else
                                {
                                    inserirEstadia(comanda, estadias, 1, 60, minutos);
                                }
                            }



                            #endregion


                            #region Quantidade de horas depois das 22
                            intervalo = now - antesDas22;

                            //Salva os minutos que ja estão dentro
                            minutos = intervalo.Minutes;

                            #region Calcula o total de minutos decorridos na estadia
                            if (intervalo.Days > 0)
                            {
                                for (int j = 0; j < intervalo.Days; j++)
                                {
                                    minutos += 1440;

                                    for (int i = 0; i < intervalo.Hours; i++)
                                    {
                                        minutos += 60;
                                    }
                                }
                            }
                            else
                            {
                                for (int i = 0; i < intervalo.Hours; i++)
                                {
                                    minutos += 60;
                                }
                            }
                            #endregion


                            if ((minutos / 60) >= 24)
                            {
                                inserirEstadia(comanda, estadias, 24, 1440, minutos);
                            }
                            else if ((minutos / 60) >= 6)
                            {
                                inserirEstadia(comanda, estadias, 6, 360, minutos);
                            }
                            else
                            {
                                if ((minutos / 60) >= 3)
                                {
                                    inserirEstadia(comanda, estadias, 3, 180, minutos);
                                }
                                else
                                {
                                    inserirEstadia(comanda, estadias, 1, 60, minutos);
                                }
                            }
                            #endregion
                        }
                        //faz o lancamento das estadias normalmente
                        else
                        {
                            #region cadastro das estadias
                            if (intervalo.Days > 0)
                            {
                                for (int j = 0; j < intervalo.Days; j++)
                                {
                                    minutos += 1440;

                                    for (int i = 0; i < intervalo.Hours; i++)
                                    {
                                        minutos += 60;
                                    }
                                }
                            }
                            else
                            {
                                for (int i = 0; i < intervalo.Hours; i++)
                                {
                                    minutos += 60;
                                }
                            }

                            // Diária 24 horas (verificar se a diaria é cadastrada mais de uma vez caso o cliente passe mais de 48 horas)
                            if ((minutos / 60) >= 24)
                            {
                                inserirEstadia(comanda, estadias, 24, 1440, minutos);
                            }
                            // Nao tem as 6 horas de pernoite, pois o checkin nao foi entre 22 e 00 hora
                            //else if ((minutos / 60) >= 6)
                            //{
                            //    inserirEstadia(comanda, estadias, 6, 360, minutos);
                            //}
                            // 3 Horas
                            else
                            {
                                if ((minutos / 60) >= 3)
                                {
                                    inserirEstadia(comanda, estadias, 3, 180, minutos);
                                }
                                else
                                {
                                    // Se tivesse uma hora, passaraia como parametro 1, 60
                                    inserirEstadia(comanda, estadias, 3, 180, minutos);
                                }
                            }
                            #endregion
                        }
                    }


                    atualizaListagem();
                }


            }
            catch (Exception)
            {
                
                throw;
            }
        }
        public void printComanda(int comandaID)
        {

            try
            {

               
                //Comanda comanda = ComandaBO.Selecionar(comandaID);
                //comanda.dtHoraSaida = PaginaBase.GetDate_doBanco();

                //ComandaBO.Salvar(comanda, 0);

                //calculaValorDiaria(comandaID);

                //var pedidos = (from a in PedidoBO.Listar(0, comanda.id)
                //               select new
                //               {
                //                   Descricao = a.Produto.descricao,
                //                   Qtd = a.quantidade,
                //                   vlrUnitario = a.valorUnitario,
                //                   total = a.quantidade * a.valorUnitario
                //               }).ToList();

              
                //if (File.Exists(Server.MapPath("/print/comanda.txt")))
                //    File.Delete(Server.MapPath("/print/comanda.txt"));

                //File.Create(Server.MapPath("/print/comanda.txt")).Close();

                //System.IO.TextWriter arquivo = System.IO.File.AppendText(Server.MapPath("/print/comanda.txt"));
   
                //arquivo.WriteLine("------ COMANDA N° " + comanda.id.ToString().PadLeft(6, '0') + " -------");
                //arquivo.WriteLine(comanda.Acomodacao.AcomodacaoTipo.descricao + " - " + comanda.Acomodacao.nome);
                //arquivo.WriteLine("Entrada   : " + comanda.dtHoraEntrada.Value.ToString());
                
                //if (comanda.dtHoraSaida != null)
                //{

                //    arquivo.WriteLine("Saída     : " + comanda.dtHoraSaida.Value.ToString());


                //    TimeSpan timeSpan = comanda.dtHoraSaida.Value.Subtract(comanda.dtHoraEntrada.Value);

                //    int horasDecorridas = timeSpan.Hours;
                //    if (timeSpan.Days > 0)
                //    {
                //        for (int i = 0; i <= timeSpan.Days; i++)
                //            horasDecorridas += 24;
                //    }
                //    string horas = horasDecorridas.ToString().PadLeft(2, '0');
                //    string Minutes = timeSpan.Minutes.ToString().PadLeft(2, '0');
                //    string Seconds = timeSpan.Seconds.ToString().PadLeft(2, '0');


                //    string tempo = horas + ":" + Minutes + ":" + Seconds;

                //    arquivo.WriteLine("Decorrido : " + tempo);
                //}

                //arquivo.WriteLine("________________________________");
                //arquivo.WriteLine("DESCRIÇÃO  QTD. VL.UN.(R$) TOTAL");
                //arquivo.WriteLine("--------------------------------");
                //decimal? total = 0;

                //foreach (var item in pedidos)
                //{
                //    arquivo.WriteLine(item.Descricao);

                //    StringBuilder texto = new StringBuilder();

                //    texto.Append(item.Qtd.ToString().PadLeft(3, '0') + "  x  ");
                //    texto.Append(item.vlrUnitario.ToString());
                //    texto.Append(" = " + item.total.ToString());

                //    arquivo.WriteLine(texto.ToString().Trim());
                //    total += item.total;
                //}

                //arquivo.WriteLine("");
                //if (comanda.valorDesconto > 0)
                //{
                //    arquivo.WriteLine("SUB TOTAL (R$)= " + total.ToString());
                //    arquivo.WriteLine("Desconto (R$) = " + comanda.valorDesconto.ToString());
                //    arquivo.WriteLine("TOTAL (R$)    = " + (total - comanda.valorDesconto).ToString());
                //}
                //else
                //arquivo.WriteLine("TOTAL (R$)    = " + total.ToString());
                //arquivo.WriteLine("_______________________________");
                //arquivo.WriteLine("ADOS - SysMotel v1.0 2014.01.02");
                //arquivo.WriteLine("Impressão: " + PaginaBase.GetDate_doBanco().ToString());
                //arquivo.Close();



                Redirect("print/printComanda.aspx?comandaID=" + comandaID.ToString(), "_blank", "HEIGHT=320,WIDTH=820,top=50,left=50,toolbar=no,scrollbars=no,resizable=no");
            }
            catch (Exception)
            {

                throw;
            }

        }

        #region FORM CheckIN

        #region Botoes
        protected void btnIcon_CheckIN_OnClick(object sender, EventArgs e)
        {
            divMensagem.Attributes["class"] = "mensagem ";

            try
            {
                LinkButton lkb = (LinkButton)sender;
                int id = int.Parse(lkb.CommandArgument);

                Acomodacao obj = AcomodacaoBO.Selecionar(id);

                DateTime now = PaginaBase.GetDate_doBanco();

                lblCheckIN_DescricaoAcomodacao.Text = obj.AcomodacaoTipo.descricao + " - " + obj.nome;
                txtCheckIN_Data.Text = now.Date.ToShortDateString();
                txtCheckIN_Hora.Text = now.TimeOfDay.ToString();

                lblCheckIN_AcomodacaoID.Text = id.ToString();

                txtCheckIN_Placa.Focus();
            }
            catch (Exception ex)
            {
                throw;
            }
        }

        protected void btnCheckIN_Salvar_OnClick(object sender, EventArgs e)
        {
            divMensagem.Attributes["class"] = "mensagem ";

            try
            {
                if (!string.IsNullOrEmpty(lblCheckIN_AcomodacaoID.Text))
                {
                    int acomodacaoID = int.Parse(lblCheckIN_AcomodacaoID.Text);

                    ComandaStatu comandStatus = ComandaStatusBO.Listar(0, "Aberta").FirstOrDefault();

                    Comanda comand = new Comanda();

                    comand.acomodocacaoID = acomodacaoID;
                    comand.comandaStatusID = comandStatus.id;
                    comand.observacoes = txtCheckIN_Observações.Text;
                    comand.formaDesconto = "R$";
                    comand.valorDesconto = 0;

                    string[] data = txtCheckIN_Data.Text.Split('/');
                    string[] horas = txtCheckIN_Hora.Text.Split(':');

                    int ano = int.Parse(data[2]);
                    int mes = int.Parse(data[1]);
                    int dia = int.Parse(data[0]);

                    int sec = int.Parse(horas[2]);
                    int min = int.Parse(horas[1]);
                    int hora = int.Parse(horas[0]);


                    DateTime dtEntrada = PaginaBase.GetDate_doBanco(); //new DateTime(ano, mes, dia, hora, min, sec); // 2/4/1999 10:15:30AM - time tick = x
                    comand.dtHoraEntrada = dtEntrada;

                    ComandaBO.Salvar(comand, 0);


                    // Muda Status Acomodacao
                    AcomodacaoStatu acomoStatus = AcomodacaoStatusBO.Listar(0, "ocupado").FirstOrDefault();

                    Acomodacao acomodocao = AcomodacaoBO.Selecionar(acomodacaoID);

                    acomodocao.acomodacaoStatusID = acomoStatus.id;

                    AcomodacaoBO.Salvar(acomodocao, 0);

                    atualizaListagem();

                    showMensagem("sucesso", "CheckIN Realizado com sucesso!");
                }
            }
            catch (Exception)
            {

                throw;
            }
        }
        protected void btnCheckIN_Voltar_OnClick(object sender, EventArgs e)
        {
            try
            {
                Response.Redirect("~/Default.aspx");
            }
            catch (Exception)
            {

                throw;
            }

        }
            
        #endregion

        #endregion
        #region FORM AddItem

        #region Botoes
        protected void btnIcon_AddItem_OnClick(object sender, EventArgs e)
        {
            divMensagem.Attributes["class"] = "mensagem ";
            try
            {
                LinkButton lkb = (LinkButton)sender;
                int id = int.Parse(lkb.CommandArgument);

                Acomodacao obj = AcomodacaoBO.Selecionar(id);

                lblADDItem_DescricaoAcomodacao.Text = obj.AcomodacaoTipo.descricao + " - " + obj.nome;
                lblADDItem_AcomodacaoID.Text = obj.id.ToString();

                txtADDItem_DescricaoProduto.Focus();
            }
            catch (Exception ex)
            {
                showMensagem("erro", ex.Message);
            }
        }

        protected void btnAddItem_AddPedido_OnClick(object sender, EventArgs e)
        {
            divMensagem.Attributes["class"] = "mensagem ";

            try
            {
                int id = int.Parse(lblADDItem_AcomodacaoID.Text);

                Acomodacao obj = AcomodacaoBO.Selecionar(id);
                int comandaID = 0;

                
                for (int i = 0; i < rptQuartos.Items.Count; i++)
                {
                    HiddenField hfAcomodacaoIDDaVez = (HiddenField)rptQuartos.Items[i].FindControl("hfAcomodacaoID");
                    if (id.ToString() == hfAcomodacaoIDDaVez.Value)
                    {
                         HiddenField hfComandaID = (HiddenField)rptQuartos.Items[i].FindControl("hfComandaID");
                         comandaID = int.Parse(hfComandaID.Value);
                    }
                }

                DateTime now = PaginaBase.GetDate_doBanco();

                if (comandaID != 0)
                {
                    Pedido pedido = new Pedido();

                    pedido.comandaID = comandaID;
                    pedido.produtoID = int.Parse(txtADDItem_DescricaoProdutoID.Text);
                    pedido.horaPedido = now;
                    pedido.observacoes = txtADDItem_Observacoes.Text.Trim();
                    pedido.quantidade = int.Parse(txtADDItem_Quantidade.Text);

                    Produto produto = ProdutoBO.Selecionar(int.Parse(txtADDItem_DescricaoProdutoID.Text));
                    pedido.valorUnitario = produto.valorUnitario;


                    PedidoStatu pedidoStatus = new PedidoStatu();

                    if (produto.vaiParaCozinha == "S")
                        pedidoStatus = PedidoStatusBO.Listar(0, "Aguardando Cozinheiro").FirstOrDefault();
                    else
                        pedidoStatus = PedidoStatusBO.Listar(0, "Consumido").FirstOrDefault();

                    pedido.pedidoStatusID = pedidoStatus.id;

                    PedidoBO.Salvar(pedido, 0);

                    atualizaListagem();

                    txtADDItem_DescricaoProdutoID.Text = "";
                    txtADDItem_DescricaoProduto.Text = "";
                    txtADDItem_Quantidade.Text = "";
                    
                    showMensagem("sucesso", "Item Adicionado com sucesso!");
                }
            }
            catch (Exception ex)
            {
                throw;
            }
        }
        #endregion

        #region AutoComplete
        protected static List<String> GetProduto(string key)
        {
            var bco = new ModeloContainer();

            List<String> sugestoes = new List<string>();
            Produto obj = new Produto();

            obj.descricao = key.ToLower();


            var lista = (from a in bco.Produtoes where a.descricao.ToLower().Contains(key) select a).ToList();

            if (lista.Count != 0)
            {
                foreach (var item in lista)
                {
                    sugestoes.Add(AutoCompleteExtender.CreateAutoCompleteItem(item.descricao, item.id.ToString()));
                }
            }

            return sugestoes;
        }

        [System.Web.Services.WebMethod]
        public static string[] GetSugestoesProdutos(String prefixText)
        {
            List<String> sugestoes = GetProduto(prefixText);
            return sugestoes.ToArray();
        }
        #endregion
        #endregion

        #region FORM Pagamento

        #region funcoes
        public void atualizaStatusAcomodacao(int acomodocaoID)
        {
            divMensagem.Attributes["class"] = "mensagem ";
            try
            {
                Acomodacao acomodacao = AcomodacaoBO.Selecionar(acomodocaoID);

                List<Comanda> comandas = ComandaBO.Listar(0, acomodocaoID);

                Comanda comandEncontrada = (from a in comandas orderby a.id descending select a).FirstOrDefault();

                if (comandEncontrada != null)
                {
                    decimal vlrTotal = 0;
                    decimal vlrJaPago = 0;

                    List<Pedido> pedidos = PedidoBO.Listar(0, comandEncontrada.id);
                    foreach (Pedido item in pedidos)
                    {
                        vlrTotal += decimal.Parse(item.valorUnitario.ToString()) * int.Parse(item.quantidade.ToString());
                    }

                    List<CXMovimento> movimentos = CXMovimentoBO.Listar(0, comandEncontrada.id, 0);
                    foreach (CXMovimento item in movimentos)
                    {
                        vlrJaPago += decimal.Parse(item.vlrRecebido.ToString());
                    }


                    if (comandEncontrada.valorDesconto == null)
                        comandEncontrada.valorDesconto = 0;

                    if ((vlrTotal - vlrJaPago - comandEncontrada.valorDesconto) <= 0)
                    {
                        acomodacao.acomodacaoStatusID = 3;// Limpeza //(from a in AcomodacaoStatusBO.Listar(0, "") where a.descricao.ToLower().Contains("limpeza") select a).FirstOrDefault().id;
                        //comandEncontrada.comandaStatusID = 2; //Fechada
                        comandEncontrada.dtHoraSaida = PaginaBase.GetDate_doBanco();
                    }
                    else
                    {
                        acomodacao.acomodacaoStatusID = 2; // Disponivel  //(from a in AcomodacaoStatusBO.Listar(0, "") where a.descricao.ToLower().Contains("ocupado") select a).FirstOrDefault().id;
                        comandEncontrada.comandaStatusID = 1; //Aberta
                        //comandEncontrada.dtHoraSaida = null;
                    }


                    if (vlrJaPago >= vlrTotal)
                    {
                        ComandaBO.Salvar(comandEncontrada, 0);
                        AcomodacaoBO.Salvar(acomodacao, 0);

                        atualizaListagem();
                    }
                }
            }
            catch
            {
                throw;
            }
        }
        public void atualizaValores(int acomodocaoID)
        {
            divMensagem.Attributes["class"] = "mensagem ";
            try
            {
                List<Comanda> comandas = ComandaBO.Listar(0, acomodocaoID);

                Comanda comandEncontrada = (from a in comandas orderby a.id descending select a).FirstOrDefault();

                if (comandEncontrada != null)
                {
                    decimal vlrTotal = 0;
                    decimal vlrJaPago = 0;

                    List<Pedido> pedidos = PedidoBO.Listar(0, comandEncontrada.id);
                    foreach (Pedido item in pedidos)
                    {
                        vlrTotal += decimal.Parse(item.valorUnitario.ToString()) * int.Parse(item.quantidade.ToString());
                    }

                    List<CXMovimento> movimentos = CXMovimentoBO.Listar(0, comandEncontrada.id, 0);
                    foreach (CXMovimento item in movimentos)
                    {
                        vlrJaPago += decimal.Parse(item.vlrRecebido.ToString());
                    }


                    if (comandEncontrada.formaDesconto != null)
                        ddlPagar_TipoDesconto.SelectedValue = comandEncontrada.formaDesconto;

                    if(comandEncontrada.valorDesconto != null)
                        txtPagar_VlrDesconto.Text = comandEncontrada.valorDesconto.ToString();

                    txtPagar_VlrTotal.Text = vlrTotal.ToString();
                    txtPagar_VlrJaPago.Text = vlrJaPago.ToString();

                    if(comandEncontrada.valorDesconto == null)
                        comandEncontrada.valorDesconto = 0;

                    txtPagar_VlrAPagar.Text = (vlrTotal - vlrJaPago - comandEncontrada.valorDesconto).ToString();
                }
            }
            catch
            {
                throw;
            }
        }
        public void atualizaListagemMovimentos(int acomodocaoID)
        {
            divMensagem.Attributes["class"] = "mensagem ";
            try
            {
                 List<Comanda> comandas = ComandaBO.Listar(0, acomodocaoID);

                 Comanda comandEncontrada = (from a in comandas orderby a.id descending select a).FirstOrDefault();
                if (comandEncontrada != null)
                {
                    CXCaixa caixa = (from a in CXCaixaBO.Listar(0, null, null).ToList()
                                     where a.dtHoraEncerramento == null
                                     select a).FirstOrDefault();
                    if (caixa != null)
                    {
                        List<CXMovimento> movimentos = CXMovimentoBO.Listar(0, comandEncontrada.id, 0);

                        var objs = (from a in movimentos
                                    where a.id == a.id //&& a.entrada == "S"
                                    select new
                                    {
                                        ID = a.id,
                                        dtHora = a.dtHora,
                                        FormaPagamento = a.CXFormaPagamento.descricao,
                                        Valor = a.vlrRecebido
                                    }).ToList();

                        rptMovimentos.DataSource = objs;
                        rptMovimentos.DataBind();
                    }
                    else
                    {
                        rptMovimentos.DataSource = null;
                        rptMovimentos.DataBind();
                    }
                }
                else
                {
                    rptMovimentos.DataSource = null;
                    rptMovimentos.DataBind();
                }
            }
            catch
            {
                throw;
            }
        }
        public void CalculaDesconto()
        {
            divMensagem.Attributes["class"] = "mensagem ";

            try
            {
                decimal valor = 0;

                if (!string.IsNullOrEmpty(lblPagar_AcomodacaoID.Text))
                {
                    if (ddlPagar_TipoDesconto.SelectedValue.ToString().Contains("%"))
                    {
                        double percentual = double.Parse(txtPagar_VlrDesconto.Text);
                        if (percentual > 100)
                            throw new Exception("O Percentual não pode ser maior do que 100%.");

                        string vl = txtPagar_VlrTotal.Text;
                        string vlJaPago = txtPagar_VlrJaPago.Text;

                        double valorTotal = double.Parse(vl) - double.Parse(vlJaPago);
                        double valorDoDesconto = double.Parse(txtPagar_VlrDesconto.Text);
                        double valorTotalComDesconto = 0;

                        valorDoDesconto = (valorDoDesconto / 100) * valorTotal;
                        valorTotalComDesconto = valorTotal - valorDoDesconto;

                        txtPagar_VlrAPagar.Text = valorTotalComDesconto.ToString();
                    }

                    else
                    {
                        string vl = txtPagar_VlrTotal.Text;
                        string vlJaPago = txtPagar_VlrJaPago.Text;

                        if (!string.IsNullOrEmpty(vl))
                        {
                            double valorTotal = double.Parse(vl) - double.Parse(vlJaPago);

                            double valorTotalComDesconto = 0;
                            double valorDoDesconto = double.Parse(txtPagar_VlrDesconto.Text);

                            if (valorDoDesconto <= valorTotal)
                            {
                                valorTotalComDesconto = valorTotal - valorDoDesconto;
                                txtPagar_VlrAPagar.Text = valorTotalComDesconto.ToString();
                            }
                            else                            
                                throw new Exception("O valor do desconto não pode ser maior do que o valor total!");
                        }
                        else
                            txtPagar_VlrAPagar.Text = valor.ToString();
                    }

                    CalculaTroco();                    
                }
            }
            catch
            {
                throw;
            }
        }
        public void CalculaTroco()
        {
            divMensagem.Attributes["class"] = "mensagem ";
            try
            {
                decimal vlRecibo = decimal.Parse(txtPagar_VlrRecebido.Text);

                decimal total = decimal.Parse(txtPagar_VlrAPagar.Text);


                decimal troco = 0;

                troco = vlRecibo - total;

                if (troco < 0)
                    txtPagar_VlrTroco.Text = "0";
                else
                    txtPagar_VlrTroco.Text = troco.ToString();

            }
            catch
            {
                throw;
            }
        }
        #endregion

        #region Botoes
        public int PaginaAtual //Propriedade da página atual, colocada no viewstate
        {
            get
            {
                object o = this.ViewState["PaginaAtual"];
                if (o == null || (int)o < 0)
                {
                    return 0;
                }
                else
                {
                    return (int)o;
                }
            }
            set
            {
                this.ViewState["PaginaAtual"] = value;
            }
        }
        protected void lnkProximo_Click(object sender, EventArgs e)
        {
            PaginaAtual++;
            atualizaListagemMovimentos(int.Parse(lblPagar_AcomodacaoID.Text));
        }

        protected void lnkAnterior_Click(object sender, EventArgs e)
        {
            PaginaAtual--;
            atualizaListagemMovimentos(int.Parse(lblPagar_AcomodacaoID.Text));
        }
        protected void btnIcon_PagarComanda_OnClick(object sender, EventArgs e)
        {
            try
            {
                divMensagem.Attributes["class"] = "mensagem ";
                try
                {
                    LinkButton lkb = (LinkButton)sender;
                    int id = int.Parse(lkb.CommandArgument);

                    Acomodacao obj = AcomodacaoBO.Selecionar(id);

                    lblPagar_AcomodacaoDescricao.Text = obj.AcomodacaoTipo.descricao + " - " + obj.nome;
                    lblPagar_AcomodacaoID.Text = obj.id.ToString();

                    atualizaValores(id);
                    atualizaListagemMovimentos(id);

                    txtPagar_VlrRecebido.Focus();
                }
                catch
                {
                    throw;
                }
            }
            catch (Exception ex)
            {
                showMensagem("erro", ex.Message);
            }
        }
        protected void btnIcon_ImprimirComanda_OnClick(object sender, EventArgs e)
        {
            try
            {
                divMensagem.Attributes["class"] = "mensagem ";
                try
                {
                    LinkButton lkb = (LinkButton)sender;
                    int id = int.Parse(lkb.CommandArgument);

                    Comanda comanda = (from a in ComandaBO.Listar(0, id) orderby a.id descending select a).FirstOrDefault();

                    lblComanda_ID.Text = comanda.id.ToString();
                    lblComanda_DescricaoAcomodoacao.Text = comanda.Acomodacao.AcomodacaoTipo.descricao + " - " + comanda.Acomodacao.nome;
                }
                catch
                {
                    throw;
                }
            }
            catch (Exception ex)
            {
                showMensagem("erro", ex.Message);
            }
        }
        


        protected void txtPagar_VlrDesconto_OnTextChanged(object sender, EventArgs e)
        {
            divMensagem.Attributes["class"] = "mensagem ";

            try
            {
                if (Request.Url.AbsolutePath.ToLower().Contains("default.aspx#div_pagamento"))
                {
                    CalculaDesconto();
                    Response.Redirect("~/Default.aspx#div_Pagamento");
                }
            }
            catch (Exception ex)
            {
                showMensagem("erro", ex.Message);
            }
        }
        protected void btnPagar_LancarMovimento_OnClick(object sender, EventArgs e)
        {
            try
            {
                divMensagem.Attributes["class"] = "mensagem ";
                try
                {
                    int acomodocaoID = int.Parse(lblPagar_AcomodacaoID.Text);
                    List<Comanda> comandas = ComandaBO.Listar(0, acomodocaoID);

                    Comanda comandEncontrada = (from a in comandas orderby a.id descending select a).FirstOrDefault();
                    if (comandEncontrada != null)
                    {
                        DateTime now = PaginaBase.GetDate_doBanco();

                        CXCaixa caixa = (from a in CXCaixaBO.Listar(0, null,null).ToList()
                                         where a.dtHoraEncerramento == null select a).FirstOrDefault();

                        if (caixa != null)
                        {
                            CXMovimento movi = new CXMovimento();

                            movi.comandaID = comandEncontrada.id;
                            movi.caixaID = caixa.id;
                            movi.formaPagamentoID = int.Parse(ddlPagar_FormaPagamento.SelectedValue);
                            movi.vlrRecebido = decimal.Parse(txtPagar_VlrRecebido.Text) - decimal.Parse(txtPagar_VlrTroco.Text);
                            //movi.entrada = "S";
                            movi.dtHora = now;

                            CXMovimentoBO.Salvar(movi, 0);

                            comandEncontrada.formaDesconto = ddlPagar_TipoDesconto.SelectedValue;
                            comandEncontrada.valorDesconto = decimal.Parse(txtPagar_VlrDesconto.Text);

                            ComandaBO.Salvar(comandEncontrada, 0);

                            atualizaStatusAcomodacao(acomodocaoID);

                            showMensagem("sucesso", "Registro salvo com sucesso");
                        }
                    }
                }
                catch
                {
                    throw;
                }
            }
            catch (Exception ex)
            {
                showMensagem("erro", ex.Message);
            }
        }
        protected void btnExcluirMovimento_OnClick(object sender, EventArgs e)
        {
            divMensagem.Attributes["class"] = "mensagem ";
            try
            {
                LinkButton btn = (LinkButton)sender;
                int id = int.Parse(btn.CommandArgument.ToString());
                CXMovimentoBO.Excluir(id, 0);

                atualizaListagemMovimentos(int.Parse(lblPagar_AcomodacaoID.Text));

                atualizaValores(int.Parse(lblPagar_AcomodacaoID.Text));

                showMensagem("sucesso", "Registro excluído com sucesso!");
            }
            catch (Exception ex)
            {
                showMensagem("erro", ex.Message);
            }
        }
        protected void btnComandaSalvar_OnClick(object sender, EventArgs e)
        {
            try
            {
                divMensagem.Attributes["class"] = "mensagem ";
                try
                {
                    if (!string.IsNullOrEmpty(lblComanda_ID.Text))
                    {
                        int id = int.Parse(lblComanda_ID.Text);

                        printComanda(id);
                    }
                }
                catch
                {
                    throw;
                }
            }
            catch (Exception ex)
            {
                showMensagem("erro", ex.Message);
            }
        }
        
        #endregion

        #endregion

        #region FORM Libera Quarto
        protected void btnLiberarQuarto_OnClick(object sender, EventArgs e)
        {
            divMensagem.Attributes["class"] = "mensagem ";
            try
            {
                LinkButton lkb = (LinkButton)sender;
                int id = int.Parse(lkb.CommandArgument);

                Acomodacao obj = AcomodacaoBO.Selecionar(id);

                lblLiberar_AcomodacaoDescricao.Text = obj.AcomodacaoTipo.descricao + " - " + obj.nome;
                lblLiberar_AcomodacaoID.Text = obj.id.ToString();
            }
            catch (Exception ex)
            {
                showMensagem("erro", ex.Message);
            }
        }
        protected void btnLiberarQuartoSalvar_OnClick(object sender, EventArgs e)
        {
            divMensagem.Attributes["class"] = "mensagem ";

            try
            {
                Acomodacao acomodacao = AcomodacaoBO.Selecionar(int.Parse(lblLiberar_AcomodacaoID.Text));


                List<Comanda> comandas = (from a in ComandaBO.Listar(0, acomodacao.id) where a.acomodocacaoID == acomodacao.id orderby a.id descending select a).ToList();

                Comanda comandEncontrada = comandas.FirstOrDefault();

                if (comandEncontrada != null)
                {
                    comandEncontrada.comandaStatusID = 2; // Encerrada

                    ComandaBO.Salvar(comandEncontrada, 0);

                    acomodacao.acomodacaoStatusID = 1;  // Livre

                    AcomodacaoBO.Salvar(acomodacao, 0);

                    atualizaListagem();

                    showMensagem("sucesso", "Registro salvo com sucesso!");
                }
            }
            catch (Exception ex)
            {
                showMensagem("erro", ex.Message);
            }
        }



        #endregion

        protected void btnPesquisar_OnClick(object sender, EventArgs e)
        {
            divMensagem.Attributes["class"] = "mensagem ";
            try
            {
                atualizaListagem();
            }
            catch (Exception ex)
            {
                showMensagem("erro", ex.Message);
            }

        }
        
    }
}